package someTestExcemple.huaweiOd.container.queue;

//华为OD机试 - 贪吃蛇 - 队列（Java 2024 E卷 200分）
//https://blog.csdn.net/guorui_java/article/details/142693496
import java.util.*;
public class GreedySnake {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] operation = sc.nextLine().split(" ");
        String[] size = sc.nextLine().split(" ");
        int high = Integer.parseInt(size[0]);
        int length = Integer.parseInt(size[1]);
        String[][] map = new String[high][length];
        //先进先出（FIFO）特性：蛇的身体是一个顺序结构，
        //蛇头每次移动，新的头部位置加入，
        //而尾部在蛇没有增长时会被移除。队列的先进先出性质刚好满足这个要求。
        //x+y坐标表示每块蛇身体  蛇头计算队伍
        Queue<String> snake = new LinkedList<>();
        // 蛇头计算队伍头 蛇尾就是队伍尾
        int headX=0,headY=0;
        //设置蛇的初始长度和移动方向
        int currentLen = 1;
        String direction ="R";
        //构建地图
        for(int i=0;i<high;i++) {
            String[] sp = sc.nextLine().split(" ");
            for(int j=0;j<length;j++) {
                map[i][j] = sp[j];
                if(sp[j].equals("H")) {
                    headX=j;
                    headY=i;
                    snake.offer(headX+"+"+headY);
                    map[i][j]="E";
                }
            }
        }
        //玩家操作处理
        for(int i=0;i<operation.length;i++) {
            if(!operation[i].equals("G")) {
                //非移动操作--更新运动方向
                direction = operation[i];
            } else {
                switch (direction) {
                    case "U":
                        headX = headX; headY= headY-1;break;
                    case "D":
                        headX = headX; headY= headY+1;break;
                    case "L":
                        headX=headX-1;headY=headY;break;
                    case "R":
                        headX=headX+1;headY=headY;break;
                }
                int afterLen = moveAndGetNewLen(headX,headY,map,currentLen,high,length,snake);
                if(afterLen == -1) {
                    break;
                } else {
                    currentLen = afterLen;
                }
            }
        }
        System.out.println(currentLen);

    }

    public static int moveAndGetNewLen(int newHeadX, int newHeadY,
                                       String[][] map, int oldLen, int high, int length
            , Queue<String> snake) {
        String newHead = newHeadX + "+" + newHeadY;
        if (newHeadX < 0 || newHeadX >= length || newHeadY < 0 || newHeadY >= high) {
            //移动后越界-游戏结束
            return -1;
        } else {
            //新蛇头位置是空
            if (map[newHeadY][newHeadX].equals("E")) {
                //先蛇尾出队
                snake.poll();
                //再判断是否撞上蛇身
                //todo 注意上面两步顺序不能反
                if (snake.contains(newHead)) {
                    return -1;
                } else {
                    //新蛇头入队
                    snake.add(newHead);
                    return oldLen;
                }

            } else {
                //新蛇头吃上食物
                //如果新蛇头撞上身体
                if (snake.contains(newHead)) {
                    return -1;
                } else {
                    //新蛇头入队 并且蛇尾不出队，蛇尾位置就是最新的蛇尾坐标
                    snake.add(newHead);
                    //成功吃上食物 -长度加1
                    return oldLen + 1;
                }
            }
        }
    }
}

/**
 * 1、输入
 * G G G
 * 2 2
 * H F
 * E E
 *
 * 2、输出
 * 2
 */
